package cn.edu.hbvtc.qms.service;

import java.util.List;

import org.springframework.security.core.userdetails.UserDetailsService;

import cn.edu.hbvtc.qms.domain.Category;
import cn.edu.hbvtc.qms.domain.Clazz;
import cn.edu.hbvtc.qms.domain.ClazzArrangement;
import cn.edu.hbvtc.qms.domain.Criteria;
import cn.edu.hbvtc.qms.domain.Department;
import cn.edu.hbvtc.qms.domain.EvalPeriod;
import cn.edu.hbvtc.qms.domain.Evaluation;
import cn.edu.hbvtc.qms.domain.Item;
import cn.edu.hbvtc.qms.domain.Teacher;
import cn.edu.hbvtc.qms.domain.Term;
import cn.edu.hbvtc.qms.domain.User;

public interface IEvaluationService extends UserDetailsService {

	/*
	 * Category对象的事务处理
	 */
	void saveCategory(Category category);
	
	void deleteCategoryById(int id);
	
	void updateCategory(Category category);
	
	List<Category> findCategorys();
	
	List<Category> findCategorysOfCriteria(Criteria criteria);
	
	Category findCategoryById(int id);
	
	
	/*
	 * Criteria对象的事务处理
	 */
	void saveCriteria(Criteria criteria);
	
	void deleteCriteriaById(int id);
	
	void updateCriteria(Criteria criteria);
	
	List<Criteria> findCriterias();
	
	Criteria findCriteriaById(int id);
	
	// 查找特定用途的并有效的评价标准
	Criteria findCriteriaByPurposeAndEnabled(String purpose);
	
	/*
	 * Item对象的事务处理
	 */
	void saveItem(Item item);
	
	void deleteItemById(int id);
	
	void updateItem(Item item);
	
	List<Item> findItems();
	
	List<Item> findItemsOfCategory(Category category);
	
	Item findItemById(int id);
	
	
	/*
	 * ClazzArrangement对象的事务处理
	 */
	void saveClazzArrangement(ClazzArrangement clazzArrangement);
	
	void deleteClazzArrangementById(int id);
	
	void updateClazzArrangement(ClazzArrangement clazzArrangement);
	
	List<ClazzArrangement> findClazzArrangements();
	
	ClazzArrangement findClazzArrangementById(int id);
	
	//通过Term去查找课程安排表
	List<ClazzArrangement> findClazzArrangementByTerm(Term term,Clazz clazz);

	// 查找某教师某学期的班级课程安排情况
	List<ClazzArrangement> findClazzArrangementOfTeacher(Teacher teacher, Term term);

	// 查找某班级某学期的课程安排情况
	List<ClazzArrangement> findClazzArrangementOfClazz(Clazz clazz, Term term);
	
	
	/*
	 * Evaluation对象的事务处理
	 */
	void saveEvaluation(Evaluation evaluation);
	
	void deleteEvaluationById(int id);
	
	void updateEvaluation(Evaluation evaluation);
	
	List<Evaluation> findEvaluations();
	
	Evaluation findEvaluationById(int id);	
	
	//查找被评价者的评价结果
	List<Evaluation> findEvaluationByEvaluated(User evaluated);
	
	// 查找指定学期下的被评价者的评价结果
	List<Evaluation> findEvaluationByEvaluated(User evaluated, Term term);
	
	// 通过班级课程安排对象（包括班级、课程、教师和学期，以及评价时间段）查找相关课程评价结果记录
	List<Evaluation> findEvaluationByClazzArrangementAndEvalPeriod(ClazzArrangement ca, EvalPeriod ep);
	
	// 查找某学生在指定评价时间段内对某班级某教师某课程的评价记录
	Evaluation findEvaluationByEvaluator(User evaluator, ClazzArrangement ca, EvalPeriod ep);


	/*
	 * EvalPeriod对象的事务处理
	 */
	void saveEvalPeriod(EvalPeriod evalPeriod);
	
	void deleteEvalPeriodById(int id);
	
	void updateEvalPeriod(EvalPeriod evalPeriod);
	
	List<EvalPeriod> findEvalPeriods();
	
	EvalPeriod findEvalPeriodById(int id);
	
	//通过院系管理员的id查找本院系的课程评价时间记录
	EvalPeriod findEvalPeriodByUserId(int userId);
	
	//查找某院系某学期当前有效的课程评价时间段
	EvalPeriod findEvalPeriodByDepartment(Department dept, Term term);
	
	//获得当前学期的最新评价时间段对象
	EvalPeriod findLateEvalPeriodByDepartmentInThisTerm(Department dept, Term term);
	
	//获得部门本学期评价时间段列表
	List<EvalPeriod> findEvalPeriodsInDeptAndTerm(Department dept, Term term);
}
